home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / ms_dos / tool / mercury / mcstdlib.c < prev    next >
Text File  |  1994-12-26  |  3KB  |  129 lines

  1. /*
  2.  
  3. MercuryInstaller for MS-DOS
  4. 汎用下請けモジュール
  5.  
  6. */
  7.  
  8. #include<stdio.h>
  9. #include<dos.h>
  10. #include<farstr.h>
  11. #include<string.h>
  12. #include<jctype.h>
  13. #include<stdarg.h>
  14.  
  15. #include"mercury.h"
  16. /*----------------------------far文字列の出力--------------------------------*/
  17. extern    int    far_fputs(char far *p,FILE *fp)
  18. {
  19.     char    buf[256];
  20.  
  21.     far_strcpy(buf,p);
  22.  
  23.     return fputs(buf,fp);
  24. }
  25. /*--------------------------- 一定字数への切り詰め --------------------------*/
  26. /* ○sの内容がnバイトを超える場合、nバイト以内になるように修正する。このとき */
  27. /*  もし全角文字の泣き別れが発生した場合は上位バイトも同時に削除する。      */
  28. /* ○sで示される領域を直接書き換え、sを返り値として返す。                    */
  29. /*---------------------------------------------------------------------------*/
  30. extern    char    *strchop(char *s,size_t n)
  31. {
  32.     if    (strlen(s)>n)
  33.     {
  34.         if    (nthctype(s,n-1)==CT_KJ1)
  35.             s[n-1] = '\0';
  36.         else
  37.             s[n]   = '\0';
  38.     }
  39.  
  40.     return s;
  41. }
  42. /*----------------------画面最下行へのメッセージの出力-----------------------*/
  43. extern    int    putmessage(char    *s,...)
  44. {
  45.     va_list    ap;
  46.     int    c;
  47.  
  48.     va_start(ap,s);
  49.  
  50.     printf("\033[%d;1f\033[33m",CON_YWIDTH);
  51.     vprintf(s,ap);
  52.     printf("\033[0m");
  53.     va_end(ap);
  54.  
  55.     c = ds_getch();
  56.  
  57.     printf("\033[%d;1f\033[2K",CON_YWIDTH);
  58.  
  59.     return c;
  60. }
  61. /*-----------------------カーソルの表示の有無を決定--------------------------*/
  62. extern    void    showcursor(int f)
  63. {
  64.     printf("\033[%d;1f",CON_YWIDTH);
  65.  
  66.     if    (f)
  67.         printf("\033[0v\033[>5l");
  68.     else
  69.         printf("\033[1v\033[>5h");
  70.  
  71.     printf("\033[2K");
  72. }
  73. /*--------------------------高速farメモリ獲得関数----------------------------*/
  74. /* 標準のfarmalloc/_dos_allocmemは非常に遅く、read_idxfile()内の大部分の時間 */
  75. /* を消費しているため高速版を用意する                                        */
  76. /*---------------------------------------------------------------------------*/
  77. extern void far *far_sbrk(size_t require)
  78. {
  79.     static unsigned    addr = 0;    /* 現在使用中のメモリブロックのアドレス */
  80.     static    long    size = 0;    /* addrのサイズ(バイト単位)    */
  81.     static    long    pos = 0;    /* これまでに使用したバイト数  */
  82.  
  83.     char    far    *ret;
  84.  
  85.     if    (pos+require>size)
  86.     {
  87.         if    (addr!=0)
  88.         {
  89.             unsigned    dummy;
  90.  
  91.             _dos_setblock((pos+15)>>4,addr,&dummy);
  92.         }
  93.         if    (_dos_allocmem(0x1000,&addr))
  94.         {
  95.             size = addr*16L;
  96.             _dos_allocmem(addr,&addr);
  97.  
  98.             if    (size>require)
  99.                 return NULL;
  100.         }
  101.         else
  102.             size = 0x10000;
  103.  
  104.         pos = 0;
  105.     }
  106.  
  107.     ret = (char far *)MK_FP(addr,0) + pos;
  108.     pos += require;
  109.  
  110. #if    0
  111.     printf("far_sbrk(0x%03X)==%Fp-%Fp\n",require,ret,ret+require-1L);
  112. #endif
  113.  
  114.     return ret;
  115. }
  116. /*---------------------------far_strdup バグ訂正版---------------------------*/
  117. /* 標準のfar_strdup()はnearmalloc()でメモリを確保するらしい                  */
  118. /*---------------------------------------------------------------------------*/
  119. extern char far *far_strdup(const char far *s)
  120. {
  121.     char    far    *p = farmalloc(far_strlen(s)+1);
  122.  
  123.     if    (p==NULL)
  124.         return NULL;
  125.     else
  126.         return far_strcpy(p,s);
  127. }
  128. /*----------------------------End of mcstdlib.c------------------------------*/
  129.